package java_reflect.Test;

import java_reflect.Student;

import java.lang.reflect.Constructor;
import java.util.Arrays;

/**
 * @author 美女
 * @date 2022/03/25 14:33
 **/
public class ReflectTest {
    public static void main(String[] args) throws Exception {
//        //获取Student类的class对象-3种方法
//        //1.直接通过类名称.class
//        Class cls1=Student.class;
//        //2.通过Student类的任意一个实例化对象，调用它的getClass方法
//        Class cls2=new Student().getClass();
//        //3.通过Class的forName方法
//        //此处要传入类的全名称：包名.类名
//        Class cls3=Class.forName("java_reflect.Student");
//        System.out.println(cls1==cls2);
//        System.out.println(cls2==cls3);

//        //per编译期类型和运行时类型都是Person类型
//        Person per=new Person();
//        //per1编译期类型是Person类型，运行时变成了Student类型
//        Person per1=new Student();
//        //验证
//        System.out.println(per.getClass());
//        System.out.println(per1.getClass());
        //通过反射获取一个Student类的实例
        //1.先获取该类的class对象
//        Class<Student> cls=Student.class;
        //2.调用class对象的newInstance方法来产生对象(Student类)的实例
        //默认调用该类的无参构造
//        Student stu=cls.newInstance();
//        System.out.println(stu);
        //想通过其他构造方法产生Student类的实例
        Class<Student> cls=Student.class;
        //拿到的是无参构造的constructor对象
        Constructor constructor=cls.getDeclaredConstructor();
        //反射破坏封装,仅限当前JVM进程中的这个constructor可用
        constructor.setAccessible(true);
        Student stu= (Student) constructor.newInstance();
        //有一个参数
        Constructor constructor1=cls.getDeclaredConstructor(String.class);
        //反射破坏封住【正向操作就相当于 Student student1=new Student("张三")】
        constructor1.setAccessible(true);
        Student student1= (Student) constructor1.newInstance("哈哈");
        System.out.println(student1);
        //有三个参数
        Constructor constructor2=cls.getDeclaredConstructor(String.class,int.class,String.class);
        constructor2.setAccessible(true);
        Student student2= (Student) constructor2.newInstance("哈哈",18,"中国");
        System.out.println(student2);



        //拿到的是一个参数的constructor对象
//        Constructor constructor1=cls.getDeclaredConstructor(String.class);
//        System.out.println(constructor);
//        System.out.println(constructor1);
    }
}
